/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.utils.string;

import java.util.Locale;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author ebrouillard Algorithme d'applatissement RCE
 */
public class ApplatissementRCE {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(ApplatissementRCE.class);
    
    /**
     * liste des caractères speciaux à traduire pour l'applatissement du
     * nom/prenom
     */
    private static final String CARACTERES_SPECIAUX =
                    "\u00C4,\u00C0,\u00C1,\u00C2,\u00C3,\u00C5,\u00C6,@,\u00CB,\u00C8,\u00C9,\u00CA,\u00CC,\u00CD,\u00CE,\u00CF,\u00D6,\u00D2,\u00D3,\u00D4,\u00D5,\u0152,\u00D8,\u00F8,\u00DC,\u00DA,\u00D9,\u00DB,\u00C7,K,J,Y,\u00DD,\u00FF,Z,\u00DF,\u00D1";

    /**
     * liste des traductions des caractères speciaux pour l'applatissement du
     * nom/prenom
     */
    private static final String CARACTERES_SPECIAUX_TRADUCTION =
                    "A,A,A,A,A,A,A,A,E,E,E,E,I,I,I,I,O,O,O,O,O,O,O,O,U,U,U,U,C,L,L,L,L,L,S,S,N";
    
    /**
     * @param str .
     * @return String
     */
    public static String getStringApplati(String str) {
        String strApplati = null;
        try {

            // Passage en lettre capitale
            strApplati = str.toUpperCase(Locale.FRANCE);
            // Remplacement des caractères spéciaux
            strApplati = StringUtils.replaceChars(strApplati, CARACTERES_SPECIAUX, CARACTERES_SPECIAUX_TRADUCTION);

            // Elimination des lettres en double et Elimination caractères ni
            // numérique ni alphabétiques
            char c = (char ) 0;
            StringBuffer result = new StringBuffer();
            for (int i = 0; i < strApplati.length(); i++) {
                c = strApplati.charAt(i);
                if (i < (strApplati.length() - 1)) {
                    if (c != (strApplati.charAt(i + 1))) {
                        // Test si bien un caractère numérique ou alphabétique
                        if (String.valueOf(c).matches("[A-Za-z0-9]")) {
                            result.append(c);
                        }
                    }
                } else {
                    // On prend le dernier caractère
                    // Test si bien un caractère numérique ou alphabétique
                    if (String.valueOf(c).matches("[A-Za-z0-9]")) {
                        result.append(c);
                    }
                }
            }
            strApplati = result.toString();
            // Remplacement des caractères consécutifs AE par A, OE par O et UE
            // par
            // U
            strApplati.replace("AE", "A");
            strApplati.replace("OE", "O");
            strApplati.replace("UE", "U");
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e.getCause());
        }

        return strApplati;
    }
}
